IMAGES TO VIDEO

Changing the images created in Dream-002 to a Video

Look at the images

In [14]:
!ls frames2/
frames2/0000.jpg  frames2/0008.jpg  frames2/0016.jpg  frames2/0024.jpg
frames2/0001.jpg  frames2/0009.jpg  frames2/0017.jpg  frames2/0025.jpg
frames2/0002.jpg  frames2/0010.jpg  frames2/0018.jpg  frames2/0026.jpg
frames2/0003.jpg  frames2/0011.jpg  frames2/0019.jpg  frames2/0027.jpg
frames2/0004.jpg  frames2/0012.jpg  frames2/0020.jpg  frames2/0028.jpg
frames2/0005.jpg  frames2/0013.jpg  frames2/0021.jpg  frames2/0029.jpg
frames2/0006.jpg  frames2/0014.jpg  frames2/0022.jpg
frames2/0007.jpg  frames2/0015.jpg  frames2/0023.jpg

Understanding images in sequence

The term %04d.jpg means videos in sequence with 4 digits 0000.jpg 0001.jpg 0002.jpg ... etc

Just to explain a bit further -- %05d.jpg would be 00000.jpg 00001.jpg
and %03d.jpg would be 000.jpg

this will sequence the images and add them to a video

In [19]:
# framerate three means tree images per second
!ffmpeg -framerate 3 -i frames2/%04d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p frames2/out2.mp4
ffmpeg version 3.4.4-0ubuntu0.18.04.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
  configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
  libavutil      55. 78.100 / 55. 78.100
  libavcodec     57.107.100 / 57.107.100
  libavformat    57. 83.100 / 57. 83.100
  libavdevice    57. 10.100 / 57. 10.100
  libavfilter     6.107.100 /  6.107.100
  libavresample   3.  7.  0 /  3.  7.  0
  libswscale      4.  8.100 /  4.  8.100
  libswresample   2.  9.100 /  2.  9.100
  libpostproc    54.  7.100 / 54.  7.100
Input #0, image2, from 'frames2/%04d.jpg':
  Duration: 00:00:10.00, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 512x512 [SAR 1:1 DAR 1:1], 3 fps, 3 tbr, 3 tbn, 3 tbc
Stream mapping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> h264 (libx264))
Press [q] to stop, [?] for help
[swscaler @ 0x55deb753ce20] deprecated pixel format used, make sure you did set range correctly
[libx264 @ 0x55deb73deda0] using SAR=1/1
[libx264 @ 0x55deb73deda0] using cpu capabilities: MMX2 SSE2Fast LZCNT
[libx264 @ 0x55deb73deda0] profile High, level 3.0
[libx264 @ 0x55deb73deda0] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'frames2/out2.mp4':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 512x512 [SAR 1:1 DAR 1:1], q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc57.107.100 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
frame=  300 fps= 53 q=-1.0 Lsize=    1668kB time=00:00:09.90 bitrate=1380.3kbits/s dup=270 drop=0 speed=1.76x    
video:1664kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.262023%
[libx264 @ 0x55deb73deda0] frame I:2     Avg QP:20.60  size: 64946
[libx264 @ 0x55deb73deda0] frame P:76    Avg QP:23.79  size: 20625
[libx264 @ 0x55deb73deda0] frame B:222   Avg QP:29.86  size:    25
[libx264 @ 0x55deb73deda0] consecutive B-frames:  1.3%  0.0%  0.0% 98.7%
[libx264 @ 0x55deb73deda0] mb I  I16..4:  0.0% 100.0%  0.0%
[libx264 @ 0x55deb73deda0] mb P  I16..4:  0.0%  2.4%  0.1%  P16..4:  8.2% 15.5% 14.3%  0.0%  0.0%    skip:59.5%
[libx264 @ 0x55deb73deda0] mb B  I16..4:  0.0%  0.0%  0.0%  B16..8:  0.7%  0.0%  0.0%  direct: 0.0%  skip:99.3%  L0: 6.7% L1:93.2% BI: 0.1%
[libx264 @ 0x55deb73deda0] 8x8 transform intra:98.0% inter:78.6%
[libx264 @ 0x55deb73deda0] coded y,uvDC,uvAC intra: 100.0% 99.9% 96.3% inter: 8.8% 9.5% 8.7%
[libx264 @ 0x55deb73deda0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 13% 20% 22%  4%  7%  8%  9%  8%  9%
[libx264 @ 0x55deb73deda0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 12% 15% 12%  6% 11% 14% 10% 10% 10%
[libx264 @ 0x55deb73deda0] i8c dc,h,v,p: 52% 18% 16% 14%
[libx264 @ 0x55deb73deda0] Weighted P-Frames: Y:1.3% UV:0.0%
[libx264 @ 0x55deb73deda0] ref P L0: 72.8% 23.0%  3.7%  0.5%  0.0%
[libx264 @ 0x55deb73deda0] ref B L0: 84.4% 15.6%
[libx264 @ 0x55deb73deda0] ref B L1: 90.2%  9.8%
[libx264 @ 0x55deb73deda0] kb/s:1362.38

To View the video in Jupyter Notebook

In [20]:
import io
import base64
from IPython.display import HTML

video = io.open('frames2/out2.mp4', 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''<video alt="test" controls>
                <source src="data:video/mp4;base64,{0}" type="video/mp4" />
             </video>'''.format(encoded.decode('ascii')))
Out[20]:
In [ ]:
%%writefile Start2.srt
1
00:00:00,000 --> 00:00:03,000
I must remember how to dream

2
00:00:03,050 --> 00:00:05,550
This is a review.

3
00:00:05,700 --> 00:00:07,900
Also refreshing how to subtitle.
In [ ]:
# convert the subtitle to an *.ass file 
!ffmpeg -i frames2/Start2.srt frames2/subtitle.ass
In [11]:
!ls frames2
0000.jpg  0006.jpg  0012.jpg  0018.jpg	0024.jpg  deepdream-withsubs-2.mp4
0001.jpg  0007.jpg  0013.jpg  0019.jpg	0025.jpg  out2.mp4
0002.jpg  0008.jpg  0014.jpg  0020.jpg	0026.jpg  Start2.srt
0003.jpg  0009.jpg  0015.jpg  0021.jpg	0027.jpg  subtitle.ass
0004.jpg  0010.jpg  0016.jpg  0022.jpg	0028.jpg
0005.jpg  0011.jpg  0017.jpg  0023.jpg	0029.jpg
In [ ]:
# overlay the 'frames2/subtitle.ass' on the 'frames/out2.mp4'
!ffmpeg -i frames/out2.mp4 -vf "ass=subtitle.ass" deepdream-withsubs-2.mp4
In [12]:
import io
import base64
from IPython.display import HTML

video = io.open('frames2/deepdream-withsubs-2.mp4', 'r+b').read()
encoded = base64.b64encode(video)
HTML(data='''<video alt="test" controls>
                <source src="data:video/mp4;base64,{0}" type="video/mp4" />
             </video>'''.format(encoded.decode('ascii')))
Out[12]:
In [ ]: